package com.tool.cn.use.download;

import java.io.File;
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.URL;

/**
 * 
 * @author wangzonghui
 * @date 2022年4月29日 下午4:29:00 
 * @Description 多线程下载文件
 */
public class DownloadThread extends Thread{
    private int startIndex;
    private int endIndex;
    private int threadId;

    public DownloadThread(int startIndex, int endIndex, int threadId) {
        this.startIndex = startIndex;
        this.endIndex = endIndex;
        this.threadId = threadId;
    }

    @Override
    public void run() {
        try{
            
        	HttpURLConnection conn = (HttpURLConnection) new URL(MainJob.path).openConnection();
            //设置一些参数
            conn.setRequestMethod("GET");   
            conn.setConnectTimeout(5000);  
            conn.setReadTimeout(5000);  
            conn.setRequestProperty("Range","bytes="+startIndex+"-"+endIndex);//设置 范围 请求参数  , 获取 线程下载范围

            if(conn.getResponseCode()==206){    //部分数据 ok
                //取出 链接中的 数据
                InputStream is = conn.getInputStream(); //存储的是服务器上面  百度客户端数据
                //输出流  ,开始写数据  ,随机读写 流
                RandomAccessFile raf = new RandomAccessFile( new File(MainJob.outputFile),"rwd");
                raf.seek(startIndex); //跳转到 每个线程 开始读取的位置
                System.out.println("线程:"+threadId+" 开始的位置:"+startIndex+"---"+" 结束位置"+endIndex);
                int len = 0;
                byte[] buf = new byte[1024];
                while((len=is.read(buf))!=-1){
                    raf.write(buf,0,len);
                }
                System.out.println("线程:"+threadId+"下载完毕...");
                raf.close();
                MainJob.finishedThread++;
                
                //如果所有线程都下载完毕 ,让finishedThread 为0
                synchronized (MainJob.path){
                	MainJob.finishedThread=0;
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
